package com.wpan.gulimall.product.feign;

import com.wpan.common.to.SkuReductionTO;
import com.wpan.common.to.SpuBoundTO;
import com.wpan.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 进行远程调用
 *  @FeignClient("gulimall-coupon")
 *      声明调用哪个远程服务 gulimall-coupon 服务
 *  在启动类上添加远程调用功能
 *      @EnableFeignClients
 */
@FeignClient("gulimall-coupon")
public interface CouponFeignService {

    /*
        远程调用逻辑
            如果有一个 Service 调用 CouponFeignService 的 saveSpuBouds 这个方法 并且给它传递了一个对象 spuBoundTo
                那么 SpringCloud 就会做的第一步: 将这个对象转为 JSON (需要有 @RequestBody 注解)
                SpringCloud 会给远程的 @FeignClient("gulimall-coupon") gulimall-coupon 这个服务发送 /coupon/spubounds/save 这个请求找到这个请求 (在注册中心找)
                发送请求的时候会将转为对象的这个 JSON 放在请求体位置 然后发送请求
            此时就是目标服务接收到请求 (请求体里面的JSON数据) 此时对象服务里面也有一个 @RequestBody SpuBoundsEntity spuBounds
                将请求体里面的 JSON 转为 SpuBoundsEntity 这个类型
                此时是可以转换的 只要在第一步的转换中的 JSON 里面的 属性名与这个对象一一对应就可以封装
        总结功能
            只要 JSON 数据模型是兼容的 双方服务无需使用同一个 TO

     */
    @PostMapping("/coupon/spubounds/save")
    R saveSpuBouds(@RequestBody SpuBoundTO spuBoundTo);

    @PostMapping("/coupon/skufullreduction/saveinfo")
    R saveSkuReduction(@RequestBody SkuReductionTO skuReductionTo);
}
